#include "Socket.h"
#include <memory.h> // for memset
#include "Log.h"

namespace dsth {

Socket::Socket() :
    socket_fd_(net::CreateNonblockSocketOrDie()) {
}


Socket::~Socket() {
    LOG_DEBUG("[Socket::~Socket] Close fd:%d.", socket_fd_);
    net::Close(socket_fd_);
}

int Socket::Bind(const InetSocketAddress& addr) {
    return net::BindOrDie(socket_fd_, addr.GetSocketAddr());
}

int Socket::Listen() {
    return net::ListenOrDie(socket_fd_);
}

int Socket::Accept(InetSocketAddress& peer_addr) {
    struct sockaddr_in addr;
    memset(&addr, 0x00, sizeof addr);
    int conn_fd = net::Accept(socket_fd_, addr);
    peer_addr.SetSocketAddr(addr);
    return conn_fd;
}

int Socket::Connect(InetSocketAddress& addr) {
    return net::Connect(socket_fd_, addr.GetSocketAddr());
}

void Socket::SetReuseAddr(bool enable) {
    net::SetReuse(enable, socket_fd_);
}

void Socket::ShutDownWrite() {
    net::ShutDownWrite(socket_fd_);
}

void Socket::Close() {
    net::Close(socket_fd_);
}

} // namespace
